home *** CD-ROM | disk | FTP | other *** search
/ Games of Daze / Infomagic - Games of Daze (Summer 1995) (Disc 1 of 2).iso / x2ftp / msdos / libs / anivga12 / jumpnrun / game.pas < prev    next >
Pascal/Delphi Source File  |  1993-07-04  |  12KB  |  510 lines

  1. Program Game;
  2.  
  3. {$X+}
  4.  
  5. Uses
  6.    Anivga, Crt, Dos, Music;
  7.  
  8. Const
  9.    Apples : Array[0..1,0..9] of Integer =((280,260,5,15,200,240,305,260,80,0),
  10.                                           (120,90,95,70,60,5,60,35,120,0));
  11.  
  12.    TileName2    ='esp.COD';   {4 tiles}
  13.    tiles_per_row=4;           {These are the proportions of }
  14.    tiles_per_column=4;        {the above 4 tile file: 2x2!  }
  15.    BlokName     = 'line.cod';
  16.    BlokHantel   = 50;
  17.    Blok         = 50;
  18.    FellowName   = 'smallnumo.lib';
  19.    FellowHantel = 30;
  20.    Fellow       = 30;
  21.    MaxX         = 190;
  22.    MinX         = 10;
  23.    Apple        = 90;
  24.    AppleHantel  = 90;
  25.    Spook        = 10;
  26.    SpookHantel  = 10;
  27.  
  28. var
  29.   PicsLoaded,
  30.            T,
  31.  FellowImage,   {* actual fellow image   *}
  32.       Teller,   {* counting variable     *}
  33.      dx_left,   {* velocity to the left  *}
  34.     dx_right,   {* velocity to the right *}
  35.           dy,   {* vertical velocity     *}
  36.        score,   {* score                 *}
  37.       OldFel,   {* old fellow image      *}
  38.  Totalapples,   {* apples got till now   *}
  39.        Level,   {* which level?          *}
  40.         ydir    {* used for 'lift'       *}
  41.  
  42.                 : Integer;
  43.  
  44.        Right,   {* right arrow key pressed*}
  45.         Left,   {* left arrow key pressed *}
  46.    FirstLeft,   {* the first time to left *}
  47.   FirstRight,   {* the first time to right*}
  48.         Jump,   {* jump key pressed       *}
  49.      Jumping,   {* busy with jumping      *}
  50.      Falling,   {* busy with falling      *}
  51.         Stop,   {* stop program           *}
  52.     OnGround,   {* reached the ground     *}
  53.      NoMusic    : boolean;
  54.  
  55.     scorestr,   {* necessary for display  *}
  56.     levelstr    {* necessary for display  *}
  57.                 : String;
  58.  
  59.           x,
  60.           y     : real;
  61.  
  62.      OldInt9: procedure;
  63.  
  64.        ScoreScr : Pointer;
  65.    
  66. Procedure trapCtrlAltDel; interrupt;
  67. begin
  68.     case Port[$60] of
  69.         1: Stop   := True;
  70.        83: NoMusic:= Not NoMusic;
  71.        75: Left   := True;
  72.        77: Right  := True;
  73.        29: Jump   := True;
  74.       157: Jump   := False;
  75.       203: Left   := False;
  76.       205: Right  := False;
  77.  
  78.     end;
  79.  
  80.     Inline ($E4/$61/$8A/$E0/$0C/$80/     { clean up as BIOS would }
  81.           $E6/$61/$86/$E0/$E6/$61/       { (from Ohlsen & Stoker, }
  82.           $B0/$20/$E6/$20);              { TP Advanced Techniques) }
  83. end;
  84.  
  85. procedure installTrap;
  86. begin
  87.    getintVec($09,@oldInt9);
  88.    setintVec($09,Addr(trapCtrlAltDel));
  89. end;
  90.  
  91. procedure uninstallTrap;
  92. begin
  93.    setintVec($09,@oldInt9);
  94. end;
  95.  
  96.  
  97. procedure InitBackGround;
  98. VAR gx,gy,count:INTEGER;
  99.     Row:WORD;
  100. begin
  101.  
  102.  XTiles:=0; YTiles:=0;
  103.  SetBackgroundMode(scrolling);
  104.  SetBackgroundScrollRange(0,-250,378,550);
  105.  {paste tiles into this background, using circular enumeration 1,2,3,4,1,...}
  106.  count:=0; Row:=0;
  107.  gy:=BackY1;
  108.  REPEAT
  109.   gx:=BackX1;
  110.   REPEAT
  111.    PutTile(gx,gy,succ(count + (Row MOD tiles_per_column)*tiles_per_row));
  112.    inc(count); count:=count MOD tiles_per_row;
  113.    inc(gx,16);
  114.   UNTIL gx>BackX2;
  115.   inc(Row); {or: Row:=(Row+1) MOD tiles_per_row}
  116.   inc(gy,16);
  117.  UNTIL gy>BackY2;
  118.  
  119. For gx:=0 to 5 Do
  120.  begin
  121.   Color:=gx+5;
  122.   Line(0,gx,316,gx,PAGE);
  123.  end;
  124.  For gx:=0 To 5 Do
  125.  begin
  126.   Color:=10-gx;
  127.   Line(0,gx+6,316,gx+6,PAGE);
  128.  end;
  129.  OutTextXY(5,2,PAGE,'SCORE:      LEVEL:      Made by BoeierBoyszz tm');
  130.  ScoreScr:=GetImage(0,0,316,10,PAGE);
  131. end;
  132.  
  133.  
  134. Procedure InitSprites;
  135. begin
  136.   if loadpalette('standard.pal',0,actualColors)=0
  137.   then BEGIN
  138.         closeroutines;
  139.         WRITELN('Couldn''t access file  : '+GetErrorMessage);
  140.         uninstallTrap;
  141.         halt
  142.        END
  143.   ELSE
  144.    SetPalette(actualColors,TRUE);
  145.  
  146.     
  147.   PicsLoaded:=loadSprite(BlokName,BlokHantel);
  148.   IF Error<>Err_None
  149.   THEN BEGIN
  150.         CloseRoutines;
  151.         WRITELN('Couldn''t access file '+BlokName+' : '+GetErrorMessage);
  152.         uninstallTrap;
  153.         halt(1)
  154.        END;
  155.  
  156.    for teller:=0 to 3 do
  157.    begin
  158.      SpriteN[Blok+teller]:= BlokHantel;
  159.      SpriteX[Blok+teller]:= 12+teller*85;
  160.      SpriteY[Blok+teller]:= 168;
  161.    end;
  162.  
  163.    
  164.  
  165.    SpriteN[Blok+4]:= BlokHantel;
  166.    SpriteX[Blok+4]:= 132;
  167.    SpriteY[Blok+4]:= 136;
  168.  
  169.    SpriteN[Blok+5]:= BlokHantel;
  170.    SpriteX[Blok+5]:= 32;
  171.    SpriteY[Blok+5]:= 106;
  172.  
  173.    SpriteN[Blok+6]:= BlokHantel;
  174.    SpriteX[Blok+6]:= 75;
  175.    SpriteY[Blok+6]:= 78;
  176.  
  177.    for teller:=0 to 2 do
  178.    begin
  179.      SpriteN[Blok+7+teller]:= BlokHantel;
  180.      SpriteX[Blok+7+teller]:= teller*85;
  181.      SpriteY[Blok+7+teller]:= 48;
  182.    end;
  183.  
  184.    SpriteN[Blok+10]:= BlokHantel;
  185.    SpriteX[Blok+10]:= 0;
  186.    SpriteY[Blok+10]:= 15;
  187.  
  188.    SpriteN[Blok+11]:= BlokHantel;
  189.    SpriteX[Blok+11]:= 85;
  190.    SpriteY[Blok+11]:= -15;
  191.  
  192.    PicsLoaded:=loadSprite(FellowName,FellowHantel);
  193.    IF Error<>Err_None
  194.    THEN BEGIN
  195.         CloseRoutines;
  196.         WRITELN('Couldn''t access file smallnumo.lib : '+GetErrorMessage);
  197.         uninstallTrap;
  198.         halt(1)
  199.    END;
  200.  
  201.    PicsLoaded:=loadSprite('Spook.lib',SpookHantel);
  202.    IF Error<>Err_None
  203.    THEN BEGIN
  204.         CloseRoutines;
  205.         WRITELN('Couldn''t access file spook.cod : '+GetErrorMessage);
  206.         uninstallTrap;
  207.         halt(1)
  208.    END;
  209.    SetSpriteCycle(Spook, PicsLoaded);
  210.    SetCycleTime(10);
  211.  
  212.    PicsLoaded:=loadSprite('quest.lib',AppleHantel);
  213.    IF Error<>Err_None
  214.    THEN BEGIN
  215.         CloseRoutines;
  216.         WRITELN('Couldn''t access file quest.lib : '+GetErrorMessage);
  217.         uninstallTrap;
  218.         halt(1)
  219.    END;
  220.  
  221.    SetSpriteCycle(Apple,Picsloaded);
  222.  
  223.    LoadTile(TileName2,1); {load the 4 tiles as tile #1..4 = inner picture}
  224.    IF Error<>Err_None
  225.     THEN BEGIN
  226.         CloseRoutines;
  227.         WRITELN('Couldn''t access file '+TileName2+' : '+GetErrorMessage);
  228.         uninstallTrap;
  229.         halt(1)
  230.        END;
  231.  
  232.  
  233. end;
  234.  
  235. Procedure InitVars;
  236. begin
  237.    TotalApples:=10;
  238.    Level      :=1;
  239.    dy         :=1;
  240.    dx_left    :=0;
  241.    dx_right   :=0;
  242.    FellowImage:=0;
  243.    score      :=0;
  244.    ydir       :=2;
  245.    Jumping    :=False;
  246.    Falling    :=False;
  247.    Jump       :=False;
  248.    Stop       :=False;
  249.    Right      :=False;
  250.    Left       :=False;
  251.    FirstRight :=True;
  252.    FirstLeft  :=True;
  253.    NoMusic    :=False;
  254. end;
  255.  
  256.  
  257. function hitground: Boolean;
  258. begin
  259.   OldFel:= SpriteN[Fellow];
  260.   if OldFel>7 then
  261.    SpriteN[Fellow]:= FellowHantel+7+2
  262.   else
  263.    SpriteN[Fellow]:= FellowHantel+2;
  264.  
  265.   For teller:= 50 to 62 do
  266.     if HitDetect(Fellow,teller) then
  267.       if (SpriteY[Fellow]+14)<SpriteY[teller] then
  268.       begin
  269.            SpriteN[Fellow]:= OldFel;
  270.            hitground:= True;
  271.            exit;
  272.       end;
  273.    SpriteN[Fellow]:= OldFel;
  274.    hitground:= False;
  275. end;
  276.  
  277.  
  278. procedure CheckXY;
  279. begin
  280.     If Right Then
  281.     begin
  282.       if OnGround and Not NoMusic Then PlayMusic('O2C');
  283.  
  284.       If FirstRight Then
  285.         begin
  286.           FirstRight:=False;
  287.           FellowImage:=0;
  288.         end;
  289.       SpriteN[Fellow]:=(FellowHantel+7) + FellowImage;
  290.       FellowImage:=(FellowImage+1) mod 6;
  291.     end
  292.     else
  293.       FirstRight:=True;
  294.  
  295.     If (Right and (dx_right<8))
  296.       then {* fellow rechts versnellen *}
  297.         Inc(dx_right,2);
  298.  
  299.     If Left Then
  300.     begin
  301.       if OnGround and Not NoMusic Then PlayMusic('O2C');
  302.       If FirstLeft Then
  303.       begin
  304.         FirstLeft:=False;
  305.         FellowImage:=0;
  306.       end;
  307.       SpriteN[Fellow]:=(FellowHantel) + FellowImage;
  308.       FellowImage:=(FellowImage+1) mod 6;
  309.     end
  310.     else
  311.       FirstLeft:=True;
  312.  
  313.    If Left and (dx_left<8) then {* increase fellow's speed to the left *}
  314.          Inc(dx_left,2);
  315.  
  316.  
  317.    If (not Right) then
  318.      If (dx_right>0) then  {* reduce fellow's speed to the right*}
  319.        Dec(dx_right,2);
  320.    If (not Left) then
  321.     If (dx_left>0) then    {* reduce fellow's speed to the left *}
  322.        Dec(dx_left,2);
  323.  
  324.  
  325.    if dy<=9 then
  326.       Inc(dy);
  327.  
  328.    if not OnGround then
  329.      if SpriteN[Fellow]< FellowHantel+7 then
  330.        SpriteN[Fellow]:= FellowHantel+ 3
  331.      else
  332.        SpriteN[Fellow]:= FellowHantel +7 +3;
  333.  
  334.     if OnGround and not Right and not Left then
  335.      if SpriteN[Fellow]< FellowHantel+7 then
  336.        SpriteN[Fellow]:= FellowHantel+ 2
  337.      else
  338.        SpriteN[Fellow]:= FellowHantel +7 +2;
  339.  
  340.   
  341. end;
  342.  
  343. procedure MoveLift;
  344. begin
  345.     if SpriteY[53]>168 Then ydir:=-2; {* for our nice lift *}
  346.     if SpriteY[53]<-20 Then ydir:=2;
  347. end;
  348.  
  349. procedure ShowScore;
  350. begin
  351.     PutImage(2,StartVirtualY+188,ScoreScr,1-PAGE);
  352.     Str(score, scorestr);
  353.     Str(level, levelstr);
  354.     OutTextXY(50,StartVirtualY+190,1-Page,scorestr);
  355.     OutTextXY(120,StartVirtualY+190,1-PAGE,levelstr);
  356. end;
  357.  
  358. function HitApples:Boolean;
  359. begin
  360.   For teller:= 90 to 99 do
  361.     if HitDetect(Fellow,teller) then
  362.       begin
  363.            SpriteN[teller]:= 0; {* erase it *}
  364.            HitApples:= True;
  365.            exit;
  366.       end;
  367.    HitApples:= False;
  368. end;
  369.  
  370. procedure PutApples;
  371. var
  372.   t: Integer;
  373. begin
  374.   for t:=0 to 9 do
  375.   begin
  376.     SpriteN[Apple+t]:= AppleHantel;
  377.     SpriteX[Apple+t]:= Apples[0,t];
  378.     SpriteY[Apple+t]:= Apples[1,t];
  379.   end;
  380. end;
  381.  
  382.  
  383. begin
  384.   RandoMize;
  385.   InstallTrap;
  386.   InitGraph;
  387.   InitBackGround;
  388.   InitSprites;
  389.   InitVars;
  390.   PutApples;
  391.  
  392.   SpriteN[Spook]:= SpookHantel;
  393.   SpriteX[Spook]:= 1;
  394.   SpriteY[Spook]:= 1;
  395.   SpriteN[Fellow]:= FellowHantel;
  396.   SpriteX[Fellow]:= 140;
  397.   SpriteY[Fellow]:= 100;
  398.   falling:=true;
  399.   animate; {* eerste keer animate doen *}
  400.   repeat
  401.     ShowScore;
  402.     MoveLift;
  403.  
  404.     
  405.     if jump and OnGround then  {* jump key pressed and on bottom *}
  406.     begin
  407.       OnGround:=FALSE;
  408.       dy:=-8;
  409.       if Not NoMusic Then PlayMusic('O4CDE');
  410.     end;
  411.  
  412.     
  413.  
  414.     Dec(SpriteX[Fellow],dx_left);  {* do horizontal movement *}
  415.     Inc(SpriteX[Fellow],dx_right); {* for both directions    *}
  416.     Inc(SpriteY[Fellow],dy);       {* do vertical movement   *}
  417.     Inc(SpriteY[53],ydir);         {* move lift              *}
  418.  
  419.     if (dy>0) and HitGround then
  420.     begin
  421.       OnGround:= True;
  422.       repeat
  423.         Dec(SpriteY[Fellow]);
  424.       until not HitGround;
  425.     end else
  426.       OnGround:= False;
  427.  
  428.  
  429.     CheckXY;
  430.  
  431.     if SpriteX[Fellow]<0 then SpriteX[Fellow]:=0
  432.     else if SpriteX[Fellow]>300 then SpriteX[Fellow]:=300;
  433.  
  434.     if SpriteX[Fellow]<>SpriteX[Spook] Then
  435.     begin
  436.       if SpriteX[Fellow]<SpriteX[Spook] then
  437.         Dec(SpriteX[Spook],Random(Level)+1)
  438.       else
  439.         Inc(SpriteX[Spook],Random(Level)+1);
  440.     end;
  441.  
  442.     if (SpriteY[Fellow]+7)<>SpriteY[Spook] Then
  443.     begin
  444.       if SpriteY[Fellow]+7<SpriteY[Spook] then
  445.         Dec(SpriteY[Spook],Random(Level)+1)
  446.       else
  447.         Inc(SpriteY[Spook],Random(Level)+1);
  448.     end;
  449.  
  450.     if HitDetect(Spook, Fellow) then
  451.     begin
  452.         if score<10 Then
  453.           score:=0
  454.         else Dec(score,10);
  455.         if Not NoMusic Then PlayMusic('O2BAGFEDCO1BAGFEDC');
  456.         if SpriteX[Fellow]>SpriteX[Spook] then
  457.         begin
  458.           dx_right:=8;
  459.           dx_left:=0;
  460.         end
  461.         else
  462.         begin
  463.           dx_left:=8;
  464.           dx_right:=0;
  465.         end;
  466.     end;
  467.  
  468.     if HitApples Then
  469.     begin
  470.       Dec(TotalApples);
  471.       if TotalApples=0 then
  472.       begin
  473.          Inc(Level);
  474.          TotalApples:=10;
  475.          PutApples;
  476.          if Not NoMusic Then PlayMusicForeGround('O4CDEFGABO3CDEFGABO2CDEFGAB');
  477.          SpriteN[Fellow]:= FellowHantel;
  478.          SpriteX[Fellow]:= 140;
  479.          SpriteY[Fellow]:= 100;
  480.       end;
  481.       if Not NoMusic Then PlayMusic('O4CDECDEGG');
  482.       Inc(score,10);
  483.     end;
  484.  
  485.     if (abs(StartVirtualY-SpriteY[Fellow]))<40 Then
  486.       StartVirtualY:=SpriteY[Fellow]-40;
  487.     if (abs(StartVirtualY+200-SpriteY[Fellow]))<70 Then
  488.       StartVirtualY:=SpriteY[Fellow]-130;
  489.  
  490.     animate; {* laat alles maar zien *}
  491.  
  492.     if SpriteY[Fellow]>326 Then
  493.     begin
  494.        StartVirtualY:=SpriteY[Fellow]-576;
  495.        SpriteY[Fellow]:=SpriteY[Fellow]-448;
  496.     end;
  497.  
  498.  until Stop;
  499.  CloseRoutines;
  500.  FreeImageMem(ScoreScr);
  501.  WriteLn('  ');
  502.  WriteLn('Your score was ',Score);
  503.  WriteLn;
  504.  WriteLn('This short game was brought to you by');
  505.  WriteLn('(c) 1992 BoeierBoyszzzz tm');
  506.  WriteLn('Folay && Hooligan');
  507.  Write(Chr(7));
  508.  uninstalltrap;
  509. end.
  510.